# coding=utf-8
from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
from common import generic
from common import const
from basedata.models import Position, Employee
from organ.models import OrgUnit
import datetime


class SalaryItemHandler:
    code = None

    def __init__(self, employee):
        self.employee = employee

    def value(self):
        return 0


class SalaryItem(models.Model):
    """
    工资项
    """
    formulas = {}

    @classmethod
    def add_formula(cls, code, handler):
        SalaryItem.formulas[code] = handler

    @classmethod
    def get_formula(cls):
        return SalaryItem.formulas.get(cls.code, None)

    code = models.CharField(_("code"), max_length=const.DB_CHAR_CODE_10, null=True)
    name = models.CharField(_("name"), max_length=const.DB_CHAR_NAME_120)
    classification = models.CharField(_("classification"), max_length=const.DB_CHAR_CODE_2,
                                      choices=const.get_value_list('S048'), default='10')
    plus_or_minus = models.CharField(_("plus or minus"), max_length=const.DB_CHAR_CODE_2,
                                     choices=const.get_value_list('S049'), default='+')
    required = models.BooleanField(_("is required"), default=0)

    def __unicode__(self):
        return "%s %s" % (self.code, self.name)

    class Meta:
        verbose_name = _('salary item')
        verbose_name_plural = _('salary items')
        ordering = ('code',)


class Entry(generic.BO):
    """
    人员入职
    """
    code = models.CharField(_("employee number"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True)
    name = models.CharField(_("employee name"), max_length=const.DB_CHAR_NAME_120)
    pinyin = models.CharField(_("pinyin"), max_length=const.DB_CHAR_NAME_120, blank=True, null=True)
    birthday = models.DateField(_("birthday"), blank=True, null=True)
    gender = models.CharField(_("gender"), max_length=const.DB_CHAR_CODE_2, choices=const.get_value_list('gender'),
                              default='1')
    idcard = models.CharField(_("id card"), max_length=const.DB_CHAR_NAME_20)
    address = models.CharField(_("mail address"), max_length=const.DB_CHAR_NAME_120, blank=True, null=True)
    zipcode = models.CharField(_("zipcode"), max_length=const.DB_CHAR_CODE_8)
    phone = models.CharField(_("phone"), max_length=const.DB_CHAR_NAME_20, blank=True, null=True)

    guider = models.ForeignKey(Employee, verbose_name=_("guider"), null=True, on_delete=models.SET_NULL)
    position = models.ForeignKey(Position, verbose_name=_('designate position'),null=True, on_delete=models.SET_NULL)
    rank = models.CharField(_("employee rank"), max_length=const.DB_CHAR_CODE_2, default='00',
                            choices=const.get_value_list('S017'))
    ygxs = models.CharField(_("employ ygxs"), max_length=const.DB_CHAR_CODE_2, blank=True, null=True,
                            choices=const.get_value_list('S019'), default='2')
    category = models.CharField(_("employ category"), max_length=const.DB_CHAR_CODE_2, blank=True, null=True,
                                choices=const.get_value_list('S018'), default='21')

    probation_months = models.CharField(_("probation months"), max_length=2, default='3',
                                        choices=const.get_value_list('S047'))
    probation_begin = models.DateField(_("probation begin"), default=datetime.date.today)
    probation_end = models.DateField(_("probation end"), blank=True, null=True)

    memo = models.TextField(_("memo"), blank=True, null=True)
    profile = models.FileField(_("profile"), blank=True, null=True, upload_to='hr profile')

    class Meta:
        verbose_name = _("employee entry")
        verbose_name_plural = _("employee entries")
        permissions = (
            ('modify_salary_item', _("modify salary item")),
        )


class EmployeeSalaryItem(models.Model):
    """

    """
    entry = models.ForeignKey(Entry, verbose_name=_("employee entry"),null=True, on_delete=models.SET_NULL)
    employee = models.ForeignKey(Employee, verbose_name=_("employee"), blank=True, null=True, on_delete=models.SET_NULL)
    salary_item = models.ForeignKey(SalaryItem, verbose_name=_("salary item"), null=True, on_delete=models.SET_NULL)
    calculate_way = models.CharField(_("calculate way"), max_length=const.DB_CHAR_CODE_2,
                                     choices=const.get_value_list('S050'), default='10')
    fixed_value = models.DecimalField(_("fixed value"), blank=True, null=True, max_digits=10, decimal_places=2)
    base_value = models.DecimalField(_("base value"), blank=True, null=True, max_digits=10, decimal_places=2)
    org_percent = models.DecimalField(_("org percent"), blank=True, null=True, max_digits=4, decimal_places=2)
    employee_percent = models.DecimalField(_("employee percent"), blank=True, null=True, max_digits=4, decimal_places=2)

    class Meta:
        verbose_name = _("salary item")
        verbose_name_plural = _("salary item")
        unique_together = (('entry', 'salary_item'),)


class Transfer(generic.BO):
    """
    人员调动
    """
    employee = models.ForeignKey(Employee, verbose_name=_("employee"),null=True, on_delete=models.SET_NULL)

    class Meta:
        verbose_name = _("employee transfer")
        verbose_name_plural = _("employee transfers")


class Departure(generic.BO):
    """
    人员离职
    """
    employee = models.ForeignKey(Employee, verbose_name=_("employee"), null=True, on_delete=models.SET_NULL)

    class Meta:
        verbose_name = _("employee departure")
        verbose_name_plural = _("employee departures")
